/*
Copyright (C) 2022-2024 Inspur Corp.

SPDX-License-Identifier: Apache-2.0
*/
package file

import (
	"fmt"
	"github.com/gabriel-vasile/mimetype"
	"io"
	"io/ioutil"
	"mime/multipart"
	"os"
	"path/filepath"
	"time"
)

// 写入文件
func Write(filePath string, data []byte, perm os.FileMode) error {
	if err := CreateIfNotExists(filePath, false); err != nil {
		return err
	}
	if err := ioutil.WriteFile(filePath, data, perm); err != nil {
		return err
	}
	return nil
}

// 判断档案是否存在
func Exists(name string) bool {
	_, err := os.Stat(name)
	return err == nil || os.IsExist(err)
}

// 判断文件是否存在
func FileExists(filename string) bool {
	fi, err := os.Stat(filename)
	return (err == nil || os.IsExist(err)) && !fi.IsDir()
}

// 判断目录是否存在
func DirExists(dirname string) bool {
	fi, err := os.Stat(dirname)
	return (err == nil || os.IsExist(err)) && fi.IsDir()
}

// 创建文件
func CreateIfNotExists(path string, isDir bool) error {
	if _, err := os.Stat(path); err != nil && os.IsNotExist(err) {
		if isDir {
			return os.Mkdir(path, 0755)
		}
		if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
			return err
		}
		f, err := os.OpenFile(path, os.O_CREATE, 0755)
		if err != nil {
			return err
		}
		f.Close()
	}
	return nil
}

// 创建文件
func CreateWithCover(path string, isDir bool) error {
	if _, err := os.Stat(path); err != nil {
		if !os.IsNotExist(err) {
			os.Remove(path)
		}
		if isDir {
			return os.MkdirAll(path, 0755)
		}
		if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
			return err
		}
		f, err := os.OpenFile(path, os.O_CREATE, 0755)
		if err != nil {
			return err
		}
		f.Close()
	}
	return nil
}

// 创建文件夹
func CreatedDir(dir string) error {
	exist := DirExists(dir)
	if !exist {
		// 创建文件夹
		err := os.MkdirAll(dir, os.ModePerm)
		if err != nil {
			return err
		}
	}
	return nil
}

// 移除文件夹
func RemoveDir(dir string) bool {
	err := os.RemoveAll(dir)
	if err != nil {
		return false
	}
	return true
}

type FileModel struct {
	Type  int         `json:"type"`
	Name  string      `json:"name"`
	Link  string      `json:"link"`
	Size  int64       `json:"size"`
	Mtime time.Time   `json:"mtime"`
	Perm  os.FileMode `json:"perm"`
}

const (
	IsDirectory = iota
	IsRegular
)

func DeleteFile(filePath string) error {
	return os.Remove(filePath)
}

func DeleteFileAll(filePath string) error {
	return os.RemoveAll(filePath)
}

// 保存上传的文件
func SaveUploadedFile(file *multipart.FileHeader, dst string) error {
	src, err := file.Open()
	if err != nil {
		return err
	}
	defer src.Close()

	out, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer out.Close()

	_, err = io.Copy(out, src)
	return err
}

func CheckFileMimeType(filePath string) bool {
	mtype, err := mimetype.DetectFile(filePath)
	if err != nil {
		return false
	}
	fmt.Printf("mimetype: %s, extension: %s\n", mtype.String(), mtype.Extension())
	ext := filepath.Ext(filePath)
	fmt.Printf("ext: %s\n", ext)
	if ext != mtype.Extension() {
		return false
	}
	return true
}
